package util;

import com.alibaba.fastjson.JSONArray;

import java.util.List;

/**
 * 本类可以将符合条件的json数组转换为where子句，以便用于SQL语句的拼接
 * 适合于字符型、数值型字段
 * 未测试日期型、布尔型字段等其他类型的字段
 */
public class Condition {
    /**
     * condition_json 多条件形成json字串
     * 示例{"value":"一","key":"name","operator":"LIKE"},
     *    {"value":"9","key":"depaartment_id","operator":"="}
     *    如果字段为字串的，无须设置模糊查询
     *    多个条件对应的where子句，数值型字段也使用引号包围起来
     *    本类依赖Fastjson
     */
    public static String toWhereClause(List<Condition> condition_json){
        //将json字串解析为Condition为元素的集合类对象
        List<Condition> conditionList = condition_json;
                //JSONArray.parseArray(condition_json.toString(),Condition.class);
        // 以where为开头，注意前后的空格
        StringBuilder sb = new StringBuilder(" WHERE ");
        //将字段名、操作符和字段值依次拼接为字串
        //每个条件后面都附加上"AND",注意前后的空格
        for (Condition c:conditionList){
            sb.append(c.getKey()).append(" ").append(c.getOperator()).append(" ");
            String value = c.getValue();
            //如果操作符是like，自动设置为模糊匹配
            if ("like".equalsIgnoreCase(c.getOperator())){
                value = "%" + value + "%";
            }
            value = TxtHelper.quoteMarked(value);//把value引起来
            sb.append(value);
            sb.append(" AND ");//注意两端的空格
        }
        //把最后一个条件后面的“and”删除（删除最后5个字符)
        TxtHelper.truncEnding(sb,5);
        return sb.toString();
    }

    //不能定义无参构造器，否则fastjson会使用它来创建对象

    public Condition(String key,String operator,String value){
        this.key = key;
        this.operator = operator;
        this.value = value;
    }

    public String getKey(){
        return key;
    }

    public String getOperator(){
        return operator;
    }

    public String getValue(){
        return value;
    }
    //字段名
    private String key;
    //操作符
    private String operator;
    //字段值
    private String value;
}
